/***********************************************************************************************************************
 * ############################################# Application AdewebLite #############################################
 * AdewebLite Android est une application permettant de consulter des emplois du temps fournis par l'université UHP
 * avec ou sans connexion internet (informations gardées en mémoire à chaque synchronisation). Et utilisant la web
 * API ADE pour collecter les données.
 * @author Andrianjafintrimo Victor, Zanette Sébastien
 * 
 * Basée sur l'application du même nom, utilisant le flux RSS (données à traiter), de :
 * @author Schnell Michaël, Zanette Sébastien
 * **********************************************************************************************************************
 */

package ade.prime.analyzer;

import java.util.ArrayList;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
 * Classe permettant de parser le flux XML récupérer grâce a la fonction
 * getResources de l'API
 *
 * @author Zanette Sébastien, Andrianjafintrimo Victor
 */
public class ParserResourceEtud extends DefaultHandler {
    // nom des tags XML

    private static final String RESOURCES = "resources";
    private static final String RESOURCE = "resource";
    private static final String ID = "id";
    private static final String NAME = "name";
    private static final String PATH = "path";
    // Array list de feeds  
    private ArrayList<FeedResourceEtud> feeds;
    // Boolean permettant de savoir si nous sommes � l'int�rieur d'une ressource
    private boolean inResource;
    // Feed courant
    private FeedResourceEtud currentFeed;
    // Buffer permettant de contenir les donn�es d'un tag XML
    private StringBuffer buffer;

    /**
     * 
     * @param target
     * @param data
     * @throws SAXException
     */
    @Override
    public void processingInstruction(String target, String data) throws SAXException {
        super.processingInstruction(target, data);
    }

    /**
     * Constructeur ParserResourceEtud
     */
    public ParserResourceEtud() {
        super();
    }

    /**
     * Cette méthode est appelée par le parser une et une seule fois au
     * démarrage de l'analyse de votre flux xml. Elle est appelée avant toutes
     * les autres méthodes de l'interface, à l'exception unique, de la méthode
     * setDocumentLocator. Cet évènement devrait vous permettre d'initialiser
     * tout ce qui doit l'être avant le début du parcours du document.
     *
     * @throws SAXException
     */
    @Override
    public void startDocument() throws SAXException {
        super.startDocument();
        this.feeds = new ArrayList<FeedResourceEtud>();

    }

    /**
     * Fonction étant déclenchée lorsque le parser trouve un tag XML C'est cette
     * méthode que nous allons utiliser pour instancier un nouveau feed
     *
     * @param uri
     * @param localName
     * @param name
     * @param attributes
     * @throws SAXException
     */
    @Override
    public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {
        // Nous r�initialisons le buffer a chaque fois qu'il rencontre un EVENT
        this.buffer = new StringBuffer();

        // Ci dessous, localName contient le nom du tag rencontr�

        // Nous avons rencontr� un tag RESOURCES, il faut donc instancier une nouvelle liste de  feed
        if (localName.equalsIgnoreCase(RESOURCES)) {
            //ne rien faire car déja fait dans startDocument()
        }

        // Nous avons rencontr� un tag RESOURCE, il faut donc instancier un nouveau feed
        if (localName.equalsIgnoreCase(RESOURCE)) {
            this.currentFeed = new FeedResourceEtud();
            this.currentFeed.setId(attributes.getValue(ID));
            this.currentFeed.setName(attributes.getValue(NAME));
            this.currentFeed.setPath(attributes.getValue(PATH));
            this.feeds.add(this.currentFeed);
            //this.inProject = true;
        }

    }

    /**
     * * Fonction �tant d�clench�e lorsque le parser � pars� l'int�rieur de la
     * balise XML La m�thode characters a donc fait son ouvrage et tous les
     * caract�re inclus dans la balise en cours sont copi�s dans le buffer On
     * peut donc tranquillement les r�cup�rer pour compl�ter notre objet
     * currentFeed.
     *
     * @param uri
     * @param localName
     * @param name
     * @throws SAXException
     */
    @Override
    public void endElement(String uri, String localName, String name) throws SAXException {

        if (localName.equalsIgnoreCase(RESOURCES)) {
            //this.feeds.add(this.currentFeed);
            //this.inProject = false;
        }
    }

    /**
     * Tout ce qui est dans l'arborescence mais n'est pas partie int�grante d'un
     * tag, d�clenche la lev�e de cet �v�nement. En g�n�ral, cet �v�nement est
     * donc lev� tout simplement par la pr�sence de texte entre la balise
     * d'ouverture et la balise de fermeture.
     * @param ch
     * @param start
     * @param length
     */
    @Override
    public void characters(char[] ch, int start, int length) {
        String lecture = new String(ch, start, length);
        if (this.buffer != null) {
            this.buffer.append(lecture);
        }
    }

    /**
     * Méthode prmettant de récupérr les données
     * @return  la liste de FeedResourceEtud
     */
    public ArrayList<FeedResourceEtud> getData() {
        return this.feeds;

    }
}
